home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / TERMINAL.I < prev    next >
Encoding:
Modula Implementation  |  1990-11-10  |  9.0 KB  |  419 lines

  1. IMPLEMENTATION MODULE Terminal; (* V#054 *)
  2. (*$L-,R-*)
  3. (*$Y+*)
  4.  
  5. (*
  6.   19.4.88 TT  WritePg geht.
  7.   23.5.89 TT  ETXKey gibt's nicht mehr - stattdessen hat /Enter/ nun gleiche
  8.                 Funktion wie /Return/; /Esc/ bricht ab; SOLn/EOLn nun mit Ctrl
  9.                 statt Shift.
  10. *)
  11. FROM SYSTEM IMPORT ASSEMBLER;
  12.  
  13. FROM SYSTEM IMPORT LONGWORD;
  14.  
  15. FROM TermBase IMPORT DoBusy, DoWrite, DoWriteCt,
  16.         DoGetRows, DoGetCols, DoGetGSX;
  17.  
  18. FROM MOSGlobals IMPORT Key;
  19.  
  20. IMPORT StringEditor, MOSConfig, Strings;
  21.  
  22.  
  23. VAR lastCh: LONGWORD;
  24.     getLast: BOOLEAN;
  25.  
  26.  
  27. PROCEDURE UndoRead;
  28.   BEGIN
  29.     ASSEMBLER
  30.         MOVE    #1,getLast
  31.     END
  32.   END UndoRead;
  33.   
  34.  
  35. PROCEDURE NumRows (): CARDINAL;
  36.   BEGIN
  37.     ASSEMBLER
  38.         MOVE.L  DoGetRows,A0
  39.         JMP     (A0)
  40.     END
  41.   END NumRows;
  42.  
  43. PROCEDURE NumCols (): CARDINAL;
  44.   BEGIN
  45.     ASSEMBLER
  46.         MOVE.L  DoGetCols,A0
  47.         JMP     (A0)
  48.     END
  49.   END NumCols;
  50.  
  51.  
  52. PROCEDURE Write (ch: CHAR);
  53.   BEGIN
  54.     ASSEMBLER
  55.         LEA     -2(A3),A0
  56.         MOVE.L  A0,(A3)+
  57.         CLR     (A3)+
  58.         MOVE.L  DoWrite,A0
  59.         JSR     (A0)
  60.         SUBQ.L  #2,A3
  61.     END
  62.   END Write;
  63.  
  64. PROCEDURE WriteCtrl (ch: CHAR);
  65.   BEGIN
  66.     ASSEMBLER
  67.         LEA     -2(A3),A0
  68.         MOVE.L  A0,(A3)+
  69.         CLR     (A3)+
  70.         MOVE.L  DoWriteCt,A0
  71.         JSR     (A0)
  72.         SUBQ.L  #2,A3
  73.     END
  74.   END WriteCtrl;
  75.  
  76. PROCEDURE WriteLn;
  77.   BEGIN
  78.     ASSEMBLER
  79.         MOVE    #$0D0A,-(A7)
  80.         MOVE.L  A7,(A3)+
  81.         MOVE    #1,(A3)+
  82.         MOVE.L  DoWrite,A0
  83.         JSR     (A0)
  84.         ADDQ.L  #2,A7
  85.     END
  86.   END WriteLn;
  87.  
  88. PROCEDURE WritePg;
  89.   BEGIN
  90.     ASSEMBLER
  91.         MOVE    #$1B45,-(A7)
  92.         MOVE.L  A7,(A3)+
  93.         MOVE    #1,(A3)+
  94.         MOVE.L  DoWrite,A0
  95.         JSR     (A0)
  96.         ADDQ.L  #2,A7
  97.     END
  98.   END WritePg;
  99.  
  100. PROCEDURE GotoXY (x, y: CARDINAL);
  101.   BEGIN
  102.     ASSEMBLER
  103.         MOVE.L  #$1B592020,-(A7)  ; ESC, 'Y'
  104.         MOVE    -(A3),D0
  105.         ADD.B   D0,2(A7)
  106.         MOVE    -(A3),D0
  107.         ADD.B   D0,3(A7)
  108.         MOVE.L  A7,(A3)+
  109.         MOVE    #3,(A3)+
  110.         MOVE.L  DoWrite,A0
  111.         JSR     (A0)
  112.         ADDQ.L  #4,A7
  113.     END
  114.   END GotoXY;
  115.  
  116. PROCEDURE GotoRowCol (row, col: CARDINAL);
  117.   BEGIN
  118.     ASSEMBLER
  119.         MOVE.L  #$1B592020,-(A7)  ; ESC, 'Y'
  120.         MOVE    -(A3),D0
  121.         ADD.B   D0,3(A7)
  122.         MOVE    -(A3),D0
  123.         ADD.B   D0,2(A7)
  124.         MOVE.L  A7,(A3)+
  125.         MOVE    #3,(A3)+
  126.         MOVE.L  DoWrite,A0
  127.         JSR     (A0)
  128.         ADDQ.L  #4,A7
  129.     END
  130.   END GotoRowCol;
  131.  
  132. PROCEDURE WriteCtrlString (REF str: ARRAY OF CHAR);
  133.   BEGIN
  134.     ASSEMBLER
  135.         MOVE.L  DoWriteCt,A0
  136.         JMP     (A0)
  137.     END
  138.   END WriteCtrlString;
  139.  
  140. PROCEDURE WriteString (REF str: ARRAY OF CHAR);
  141.   BEGIN
  142.     ASSEMBLER
  143.         MOVE.L  DoWrite,A0
  144.         JMP     (A0)
  145.     END
  146.   END WriteString;
  147.  
  148. PROCEDURE get;
  149.   (* holt Taste nach D0 *)
  150.   (* EQ: last geholt -> kein erneutes Echo! *)
  151.   BEGIN
  152.     ASSEMBLER
  153.         TST     getLast
  154.         BNE     b
  155.         MOVE.L  DoGetGSX,A0
  156.         JSR     (A0)
  157.         MOVE.L  -(A3),D0
  158.         MOVE.L  D0,lastCh
  159.         RTS
  160.       b MOVE.L  lastCh,D0
  161.         CLR     getLast
  162.     END
  163.   END get;
  164.  
  165. PROCEDURE waiting;
  166.   (* NE: Taste wartet *)
  167.   BEGIN
  168.     ASSEMBLER
  169.         TST     getLast
  170.         BNE     b
  171.         MOVE.L  DoBusy,A0
  172.         JSR     (A0)
  173.         TST     -(A3)
  174.       b
  175.     END
  176.   END waiting;
  177.   
  178. PROCEDURE GetKey (VAR k: Key);
  179.   BEGIN
  180.     ASSEMBLER
  181.         JSR     get
  182.         ROR.L   #8,D0
  183.         SWAP    D0
  184.         LSR.B   #1,D0
  185.         BCC     n
  186.         BSET    #0,D0
  187.      n: ANDI.B  #1111%,D0
  188.         SWAP    D0
  189.         LSR.W   #8,D0
  190.         MOVE.L  -(A3),A0
  191.         MOVE.L  D0,(A0)
  192.     END
  193.   END GetKey;
  194.  
  195. PROCEDURE Read (VAR ch: CHAR);
  196.   BEGIN
  197.     ASSEMBLER
  198.         SUBQ.L  #4,A7
  199.         ; Zuerst prüfen, ob schon ein Zeichen ansteht.
  200.         JSR     waiting
  201.         BNE     waits
  202.         ; Cursor anschalten
  203.         MOVE    #$1B65,(A7)   ; ESC, 'e'
  204.         MOVE.L  A7,(A3)+
  205.         MOVE    #1,(A3)+
  206.         MOVE.L  DoWrite,A0
  207.         JSR     (A0)
  208.       waits
  209.         ; Zeichen holen
  210.         MOVE    getLast,-(A7)
  211.         JSR     get
  212.         MOVE    (A7)+,D2
  213.         MOVE.L  -(A3),A0
  214.         MOVE.B  D0,(A0)
  215.         ; Cursor ausschalten und Zeichen ausgeben
  216.         MOVE    #$1B66,(A7)   ; ESC, 'f'
  217.         MOVE.B  D0,2(A7)
  218.         MOVE.L  A7,(A3)+
  219.         MOVEQ   #1,D1
  220.         TST     D2
  221.         BNE     notpr
  222.         CMPI.B  #' ',D0
  223.         BCS     notpr
  224.         ADDQ    #1,D1
  225.       notpr
  226.         MOVE    D1,(A3)+
  227.         MOVE.L  DoWrite,A0
  228.         JSR     (A0)
  229.         ADDQ.L  #4,A7
  230.     END
  231.   END Read;
  232.  
  233. PROCEDURE GetChar (VAR ch: CHAR);
  234.   BEGIN
  235.     ASSEMBLER
  236.         JSR     get
  237.         MOVE.L  -(A3),A0
  238.         MOVE.B  D0,(A0)
  239.     END
  240.   END GetChar;
  241.  
  242. PROCEDURE KeyPressed (): BOOLEAN;
  243.   BEGIN
  244.     ASSEMBLER
  245.         JSR     waiting
  246.         SNE     D0
  247.         ANDI    #1,D0
  248.         MOVE    D0,(A3)+
  249.     END
  250.   END KeyPressed;
  251.  
  252. PROCEDURE CondRead (VAR ch: CHAR; VAR success: BOOLEAN);
  253.   BEGIN
  254.     ASSEMBLER
  255.         JSR     waiting
  256.         SNE     D0
  257.         AND     #1,D0
  258.         MOVE.L  -(A3),A0
  259.         MOVE    D0,(A0)
  260.         BEQ     noCh
  261.         JSR     get
  262.         MOVE.L  -(A3),A0
  263.         MOVE.B  D0,(A0)
  264.         RTS
  265.       noCh
  266.         MOVE.L  -(A3),A0
  267.         CLR.B   (A0)
  268.     END
  269.   END CondRead;
  270.  
  271. PROCEDURE BusyRead (VAR ch:CHAR);
  272.   BEGIN
  273.     ASSEMBLER
  274.         SUBQ.L  #2,A7
  275.         MOVE.L  A7,(A3)+
  276.         JSR     CondRead
  277.         ADDQ.L  #2,A7
  278.     END
  279.   END BusyRead;
  280.  
  281. PROCEDURE FlushKbd;
  282.   BEGIN
  283.     ASSEMBLER
  284.       c JSR     waiting
  285.         BEQ     ende
  286.         JSR     get
  287.         BRA     c
  288.       ende
  289.     END
  290.   END FlushKbd;
  291.  
  292.  
  293. PROCEDURE moveX (no: INTEGER);
  294.   VAR  i: INTEGER;
  295.       ch: CHAR;
  296.   (*$L+*)
  297.   BEGIN
  298.     IF no < 0 THEN ch:= 'D' ELSE ch:= 'C' END;
  299.     FOR i:= 1 TO ABS (no) DO
  300.       Write(33C);
  301.       Write(ch)
  302.     END
  303.   END moveX;
  304.   (*$L=*)
  305.  
  306. VAR globLeadingBlanks: BOOLEAN;
  307.     globToken: BOOLEAN;
  308.  
  309. PROCEDURE rdCmd (VAR c: StringEditor.Commands; VAR ch: CHAR);
  310.   (*$L+*)
  311.   VAR k: Key; again, isSep: BOOLEAN;
  312.   BEGIN
  313.     Write (33C); (* ESC *)
  314.     Write ('e'); (* cursor ein *)
  315.     again:= FALSE;
  316.     REPEAT
  317.       GetKey (k);
  318.       ch:= k.ch;
  319.       c:= StringEditor.StdCmd (k);
  320.       IF globToken THEN
  321.         isSep:= ch IN MOSConfig.Separators;
  322.         IF globLeadingBlanks THEN
  323.           IF isSep THEN
  324.             IF ch >= ' ' THEN
  325.               Write (ch)
  326.             END;
  327.             again:= TRUE;
  328.           ELSE
  329.             globLeadingBlanks:= FALSE
  330.           END
  331.         ELSIF isSep THEN
  332.           IF ch >= ' ' THEN
  333.             Write (ch)
  334.           END;
  335.           c:= StringEditor.enter
  336.         END
  337.       END
  338.     UNTIL ~again;
  339.     Done:= (c # StringEditor.abort);
  340.     Write (33C); (* ESC *)
  341.     Write ('f'); (* cursor aus *)
  342.   END rdCmd;
  343.   (*$L=*)
  344.  
  345. PROCEDURE myEditLine( VAR dStr: ARRAY OF CHAR; mayCtrl, token: BOOLEAN);
  346.   (*$L+*)
  347.   BEGIN
  348.     globToken:= token;
  349.     globLeadingBlanks:= TRUE;
  350.     StringEditor.Edit (dStr, mayCtrl, WriteCtrl, WriteCtrlString, moveX, rdCmd)
  351.   END myEditLine;
  352.   (*$L=*)
  353.  
  354.  
  355. PROCEDURE EditLine (VAR str: ARRAY OF CHAR);
  356.   BEGIN
  357.     ASSEMBLER
  358.         CLR     (A3)+
  359.         CLR     (A3)+
  360.         JMP     myEditLine
  361.     END
  362.   END EditLine;
  363.  
  364. PROCEDURE ReadLine (VAR str: ARRAY OF CHAR);
  365.   BEGIN
  366.     ASSEMBLER
  367.         MOVE.L  -6(A3),A0
  368.         CLR.B   (A0)
  369.         JMP     EditLine
  370.     END
  371.   END ReadLine;
  372.  
  373. PROCEDURE EditCtrlLine (VAR str: ARRAY OF CHAR);
  374.   BEGIN
  375.     ASSEMBLER
  376.         MOVE    #1,(A3)+
  377.         CLR     (A3)+
  378.         JMP     myEditLine
  379.     END
  380.   END EditCtrlLine;
  381.  
  382. PROCEDURE ReadCtrlLine (VAR str: ARRAY OF CHAR);
  383.   BEGIN
  384.     ASSEMBLER
  385.         MOVE.L  -6(A3),A0
  386.         CLR.B   (A0)
  387.         JMP     EditCtrlLine
  388.     END
  389.   END ReadCtrlLine;
  390.  
  391.  
  392. PROCEDURE ReadString (VAR str: ARRAY OF CHAR);
  393.   BEGIN
  394.     ASSEMBLER
  395.         JMP     ReadLine
  396.     END
  397.   END ReadString;
  398.  
  399. PROCEDURE ReadToken (VAR str: ARRAY OF CHAR);
  400.   BEGIN
  401.     ASSEMBLER
  402.         MOVE.L  -6(A3),A0
  403.         CLR.B   (A0)
  404.         CLR     (A3)+
  405.         MOVE    #1,(A3)+
  406.         JMP     myEditLine
  407.     END
  408.   END ReadToken;
  409.  
  410.  
  411. BEGIN
  412.   Write (33C); (* ESC *)
  413.   Write ('v'); (* automatisches CR am Zeilenende *)
  414.   Write (33C); (* ESC *)
  415.   Write ('f'); (* cursor aus *)
  416. END Terminal.
  417. ə
  418. (* $00000DB6$FFEEC2C1$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$00001B43$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7$FFFC30A7Ç$00001C77T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$FFED85AF$00001C2D$FFED85AF$FFED85AF$FFED85AF$FFED85AF$00001C2D$FFED85AF$00001C77$00001C59$00001C6A$00000035$00000144$00000042$00000125$00001BEBãÇü*)
  419.